管理アカウントから全メンバーアカウントを一括操作するためのIAMロールをAWS CloudFormation StackSetsで展開する方法

管理アカウントから全メンバーアカウントを一括操作するためのIAMロールをAWS CloudFormation StackSetsで展開する方法

Clock Icon2025.01.17

はじめに

管理アカウントから全メンバーアカウントを操作するために、AWS CloudFormation StackSetsを使用してIAMロールを展開する手順をまとめました。

以下の記事のように、管理アカウントから全メンバーアカウントに対して特定の操作を行いたい場合があるかと思います。

https://dev.classmethod.jp/articles/multi-account-security-hub-standards-aggregation/

https://dev.classmethod.jp/articles/bulk-delete-iam-access-analyzer-aws-organizations/

管理アカウントから全メンバーアカウントに対して操作を行うには、以下の手順でIAMロールを展開します。

  1. 管理アカウントから各リソースアカウントのリソースを操作するために必要なクロスアカウント用IAMロール(CrossAccountAdminRole)を作成する
  2. 管理アカウントからCloudFormation StackSetsを使用して、各リソースアカウントに対して一括でIAMロールを展開する
  3. その後、管理アカウントからAWS CloudShellを使用してスクリプトやAWS Lambdaを実行する。スクリプトやコードの内容は任意ですが、各アカウントのIAMロールにAssumeRoleを実行し、特定の作業を行うことを想定しています。

今回は、管理アカウントからCloudFormation StackSetsを使用し、各リソースアカウントに対してIAMロールを一括で展開する方法を解説します。

StackSetsの作成

今回、各メンバーアカウントに作成するIAMロールのCloudFormationテンプレートは以下の通りです。

arn:aws:iam::xxxxxxxxxxxx:rootは、管理アカウントIDを記載ください。

cross-account-admin-role.yaml
AWSTemplateFormatVersion: 2010-09-09
Description: Create IAM Role for Cross-Account Access with Administrator Access

Resources:
  CrossAccountRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: CrossAccountAdminRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              AWS: arn:aws:iam::xxxxxxxxxxxx:root
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AdministratorAccess
      Path: /

Outputs:
  CrossAccountRoleArn:
    Description: ARN of the created IAM Role
    Value: !GetAtt CrossAccountRole.Arn
    Export:
      Name: CrossAccountRoleArn

IAMロールの設定には、汎用的な設定と限定的な設定の2つのアプローチがあります。

汎用的な設定であれば、Admin権限を付与し、複数の用途で使用できる利点がありますが、誤操作時にアカウント全体に影響が及ぶリスクがあります。

一方、限定的な設定では、特定の権限のみを付与することでリスクを最小限に抑えることが可能です。

基本的には、後者の限定的なIAMロールの利用を推奨しますが、今回は管理者権限を持つIAMロールを使用します。

また、管理アカウントのどのリソースからAssumeRoleを受け入れるかを制限することも可能ですが、今回は管理アカウントからAWS LambdaやIAMユーザーなど、すべてのAssumeRoleを受け入れる設定にしています。

上記のテンプレートを利用し、管理アカウント上で、CloudFormation StackSetsを作成します。
設定は以下の通りです。

  • アクセス許可モデル:サービスマネージドアクセス許可(SERVICE_MANAGED)
  • テンプレート:cross-account-admin-role.yaml
    cm-hirai-screenshot 2025-01-15 8.40.40
  • StackSet名:cross-account-admin-role
    cm-hirai-screenshot 2025-01-15 8.40.51
  • マネージド型の実行:非アクティブ
    cm-hirai-screenshot 2025-01-15 8.41.20
  • デプロイターゲット:組織へのデプロイ(全メンバーアカウントが対象であり、管理アカウントにはIAMロール作成されません)
  • 自動デプロイオプション
    • 自動デプロイ:アクティブ化済み
    • アカウント削除の動作:スタックを削除
  • リージョンの指定:東京リージョンのみ
  • 同時アカウントの最大数(スタックを同時にデプロイできるリージョン別のアカウント数)
    • 50
  • 障害耐性(スタックが失敗できるリージョン別のアカウント数)
    • 50
      cm-hirai-screenshot 2025-01-15 8.41.52

IAMロールはグローバルリソースのため、リージョン指定では東京リージョンの1リージョンを指定します。

同時アカウントの最大数と障害耐性は、アカウント数が多い場合、並列してスタックをデプロイできる方が早くオペレーションが完了するため、50にしました。各環境に併せて変更ください。

オペレーションが成功したことを、CloudFormationのコンソール画面で確認してください。

cm-hirai-screenshot 2025-01-15 8.48.50

スタックインスタンスでスタックが作成されたアカウントが確認できます。

cm-hirai-screenshot 2025-01-15 8.49.39

このIAMロールを利用して、冒頭でもご紹介した以下のようなことができます。

スタックを削除する

作業が完了し、IAMロールが不要になった場合は、「StackSet からスタックを削除」を選択して削除できます。
cm-hirai-screenshot 2024-12-24 14.40.04

以下の設定を使用してスタックを削除します。

  • AWS OU ID:r-o2pk(Root OU)
  • リージョンの指定:東京リージョン
  • 同時アカウントの最大数:50
  • 障害耐性:50
    cm-hirai-screenshot 2024-12-24 14.46.55

オペレーションが成功したことを確認してください。

cm-hirai-screenshot 2025-01-15 8.52.01

これで各メンバーアカウントに展開したIAMロールは削除されました。

スタックを追加する

この後、「StackSet を削除」を選択することで、StackSetを削除できます。

ただし、再度IAMロールが必要になる可能性がある場合は、StackSetを削除せずに残しておくことで、必要なタイミングでStackSetにスタックを追加し、各リソースアカウントにIAMロールを再作成できます。

再作成する場合は、「アクション」から「StackSet にスタックを追加」を選択します。

cm-hirai-screenshot 2024-12-24 14.49.42

以下の設定を使用してスタックを追加します。

  • デプロイターゲット:組織へのデプロイ
  • リージョンの指定:東京リージョン
  • 同時アカウントの最大数:50
  • 障害耐性:50

cm-hirai-screenshot 2024-12-24 14.54.10

オペレーションが成功したことを確認します。

cm-hirai-screenshot 2025-01-15 8.55.28

これでスタックの再作成が完了しました。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.